home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / tcl / mxedit.bindings < prev    next >
Text File  |  1992-07-16  |  18KB  |  550 lines

  1. # mxedit.bindings
  2.  
  3. # Default bindings for the mxedit widget.  This imports the names
  4. # of various menus in order to establish keyboard bindings and menu
  5. # accelerators in a consistent manner via the mxMenuBind procedure.
  6. #
  7. # This also includes bindings for the search/replace and command entries
  8. #
  9. # Copyright (c) 1992 Xerox Corporation.
  10. # Use and copying of this software and preparation of derivative works based
  11. # upon this software are permitted. Any distribution of this software or
  12. # derivative works must comply with all applicable United States export
  13. # control laws. This software is made available AS IS, and Xerox Corporation
  14. # makes no warranty about the software, its performance or its conformity to
  15. # any specification.
  16. #
  17.  
  18. # showBindings --
  19. #    Pop up a new window to display key bindings.
  20. #    Note that we seem to get them back in reverse order
  21. #    to which they were defined, so mxBindings should
  22. #    define boring ones first.
  23.  
  24. proc showBindings { args } {
  25.     global mxedit
  26.     set newWindow [mxopen {}]
  27.     send $newWindow {insert Keystroke\ Bindings:\n}
  28.     send $newWindow {insert ---------\ --------\n}
  29.     if {[llength $args] == 0} {set args [bind $mxedit]}
  30.     foreach binding $args {
  31.     send $newWindow [list insert [format {\n%-20s => "%s"}             $binding [bind $mxedit $binding]]]
  32.     }
  33.     send $newWindow clean
  34.     send $newWindow {see 0.0}
  35.  
  36. }
  37.  
  38. # basicBindings --
  39. #    Set up ASCII input and a couple other bindings for an mxedit widget
  40. #    that probably don't need to be changed on a per-user basis
  41.  
  42. proc basicBindings { widget } {
  43.  
  44.     # Set up ascii input
  45.     bindLatin1 $widget
  46.     bind $widget <Return> "newline ; see caret"
  47.     bind $widget <Tab> "$widget ! insert %A"
  48.     bind $widget <BackSpace> "deleteBackChar"
  49.  
  50.     # clicking on edit window grabs focus.
  51.     # The history ignore prevents double clicks from forgetting history
  52.     # because ordinarily a mouse click does reset history, except when
  53.     # nothing new has happened since the last click.
  54.  
  55.     bind $widget <1> "history ignore \"focus $widget\""
  56. }
  57.  
  58. # mxBindings --
  59. # This sets up the keystroke bindings for an mxedit widget.
  60. # This procedure uses mxMenuBind to set up keyboard accelerators.
  61. # mxMenuBind keeps the menu display up-to-date with the keyboard bindings.
  62. #
  63.  
  64. proc mxBindings { widget } {
  65.  
  66.     # Set up ASCII input
  67.     basicBindings $widget
  68.  
  69.     # Mark-related bindings
  70.     bindMarks $widget
  71.  
  72.     ### FILE OPERATIONS
  73.     mxMenuBind <Control-s> File "Save"
  74.     mxMenuBind <Control-q> File "Quit"
  75.     mxMenuBind <Control-o> File "Open new window"
  76.     mxMenuBind <Mod1-o>       File "Open file SEL"
  77.     mxMenuBind <Mod1-s>       File "Switch to file SEL"
  78.     mxMenuBind <Escape><s> File "Switch to previous file"
  79.     mxMenuBind <Control-t> File "Switch to tag SEL"
  80.     mxMenuBind <Mod1-t>    File "Open on tag SEL"
  81.     mxMenuBind <Control-g> File "Go to line SEL"
  82.  
  83.     # Open a new window, using the current word as the tag
  84.     bind $widget <Escape><t> {
  85.     set _t [mark [mark caret forw 1 word] back 1 char]
  86.     mxselection set [mark $_t back 1 word] $_t
  87.     applyToSelection tagOpen
  88.     }
  89.  
  90.     ### EDITING OPERATIONS
  91.  
  92.     mxMenuBind <Control-u> Edit "Undo"
  93.     mxMenuBind <Control-a> Edit "Do Again"
  94.     mxMenuBind <Control-d> Edit "Delete SEL"
  95.     mxMenuBind <Control-v> Edit "Paste"
  96.     mxMenuBind <Mod1-v>    Edit "Move SEL"
  97.  
  98.     # Delete selection and save it
  99.     bind $widget <Escape><d> { deleteSave }
  100.     # Paste saved selection
  101.     bind $widget <Escape><v> { pasteSave }
  102.  
  103.     ### INDENTATION
  104.  
  105.     # Indent the line at the insertion point
  106.     global indent
  107.     if {![info exists indent]} {
  108.     set indent 4
  109.     }
  110.     mxMenuBind <Control-p>  Edit "Indent line"
  111.     mxMenuBind <Control-y>  Edit "Outdent line"
  112.     mxMenuBind <Mod1-p>     Edit "Indent SEL"
  113.     mxMenuBind <Mod1-y>     Edit "Outdent SEL"
  114.  
  115.     ### SEARCH/REPLACE OPERATIONS
  116.  
  117.     mxMenuBind <Control-f> Search "Forward"
  118.     mxMenuBind <Mod1-f>    Search "Forward for SEL"
  119.     mxMenuBind <Control-b> Search "Backward"
  120.     mxMenuBind <Mod1-b>    Search "Backward for SEL"
  121.     mxMenuBind <Control-r> Search "Replace"
  122.     mxMenuBind <Mod1-r>    Search "Replace in SEL"
  123.  
  124.     # Clear and focus on the replace window
  125.     bind $widget <Escape><r>    { replaceClear }
  126.     # Make sure the find window is visible
  127.     bind $widget <Escape><f>    { findClear }
  128.  
  129.     # Search Forward and don't change selection (BROKEN)
  130.     bind $widget <Escape><Control-f> {history next history {
  131.     set _l [mark sel.left]
  132.     set _r [mark sel.right]
  133.     mxselection set caret
  134.     applyToSelection {search forward}
  135.     mxselection set $_l $_r
  136.     }}
  137.     # Search Backward and don't change selection (BROKEN)
  138.     bind $widget <Escape><Control-b> {history next history {
  139.     set _l [mark sel.left]
  140.     set _r [mark sel.right]
  141.     selection set caret
  142.     applyToSelection {search backward}
  143.     selection set $_l $_r
  144.     }}
  145.  
  146.     ### KEYBOARD EDITTING
  147.  
  148.     # Delete forward character
  149.     bind $widget <Control-l> { deleteForwChar }
  150.  
  151.     # Delete backward character
  152.     bind $widget <Control-h> { deleteBackChar }
  153.  
  154.     bind $widget <Delete> { deleteBackChar }
  155.  
  156.     # Delete backward word
  157.     bind $widget <Control-w> { deleteBackWord }
  158.  
  159.     # Delete forward word
  160.     bind $widget <Control-n> { deleteForwWord }
  161.  
  162.     # Delete to end of line
  163.     bind $widget <Control-e> { deleteEndOfLine }
  164.  
  165.     # Delete the current line
  166.     bind $widget <Control-x> { deleteLine }
  167.  
  168.     # Open a line below this one
  169.     bind $widget <Control-j> { openLineBelow }
  170.  
  171.     # Open a line above this one
  172.     bind $widget <Control-k> { openLineAbove }
  173.  
  174.     ### KEYBOARD MOTION
  175.  
  176.     # Backward one character
  177.     bind $widget <Mod1-h> { back1char }
  178.  
  179.     # Forward one character
  180.     bind $widget <Mod1-l> { forw1char }
  181.  
  182.     # Down one line
  183.     bind $widget <Mod1-j> { down1line }
  184.     bind $widget <Mod1-Return> { nextline }
  185.  
  186.     # Up one line
  187.     bind $widget <Mod1-k> { up1line }
  188.  
  189.     # Backward one word
  190.     bind $widget <Mod1-w> { back1word }
  191.  
  192.     # Forward one word
  193.     bind $widget <Mod1-n> { forw1word }
  194.  
  195.     # To end-of-line
  196.     bind $widget <Mod1-e> { endOfLine }
  197.  
  198.     # Miscellany
  199.  
  200.     # Change focus to the command entry widget
  201.     bind $widget <Control-c> { mxCommandFocus }
  202.  
  203.     bind $widget <Control-question> { caretInfo }
  204.  
  205. }
  206.  
  207. #####################################################################
  208. # These are additions to the entry widget bindings that rightfully
  209. # belong in tk.tcl, but I don't want folks to have to modify that.
  210. # These add mxedit-like bindings to entry widgets.
  211.  
  212. bind Entry <Control-l> {tk_entryDelRight %W}
  213. bind Entry <Mod1-h> { tk_entryBack1char %W }
  214. bind Entry <Mod1-l> { tk_entryForw1char %W }
  215. bind Entry <Mod1-e> { tk_entryEndOfLine %W }
  216.  
  217. # Make the third button extend the selection
  218. bind Entry <3> { %W select adjust @%x }
  219.  
  220. #####################################################################
  221. # mxCommandBindings --
  222.  
  223. proc mxCommandBindings { entry } {
  224.     bind $entry <Return>        { mxDoCmd }
  225.     bind $entry <Control-Return>    { mxeditFocus }
  226.     bind $entry <Control-q>        { mxCommandHide ; mxeditFocus }
  227.     bind $entry <Control-f>        { searchFocus }
  228.     bind $entry <Control-r>        { replaceFocus }
  229. }
  230.  
  231. # searchBindings --
  232. #    Extra bindings for the search entry widget
  233.  
  234. proc searchBindings { entry } {
  235.     bind $entry <Return>    { findInner forward }
  236.     bind $entry <Control-f>    { findInner forward }
  237.     bind $entry <Control-f>    { findInner forward }
  238.     bind $entry <Control-Return> { findInner backward }
  239.     bind $entry <Control-r>    { replaceFocus }
  240.     bind $entry <Control-q>    { hideFind ; mxeditFocus }
  241.     bind $entry <Control-c>    { mxeditFocus }
  242. }
  243.  
  244. # replaceBindings --
  245. #    Extra bindings for the replace entry widget
  246.  
  247. proc replaceBindings { entry } {
  248.     bind $entry <Return>    { findInner replace }
  249.     bind $entry <Control-r>    { findInner replace }
  250.     bind $entry <Mod1-r>    { findInner replaceSel }
  251.     bind $entry <Escape><r>    { findInner replaceEverywhere }
  252.     bind $entry <Control-f>    { searchFocus }
  253.     bind $entry <Control-q>    { hideFind ; mxeditFocus }
  254.     bind $entry <Control-c>    { mxeditFocus }
  255. }
  256.  
  257. # emacsBindings --
  258. # This sets up emacs-like keystroke bindings for an mxedit widget.
  259. # This procedure uses mxMenuBind to set up keyboard accelerators.
  260. # mxMenuBind keeps the menu display up-to-date with the keyboard bindings.
  261. #
  262.  
  263. proc emacsBindings { } {
  264.     global mxedit
  265.     set widget $mxedit
  266.  
  267.     # Set up ASCII input
  268.     basicBindings $widget
  269.  
  270.     # Nuked the mark-related bindings
  271.  
  272.     ### FILE OPERATIONS
  273.     mxMenuBind <Control-x><Control-s> File "Save"
  274.     mxMenuBind <Control-x><Control-q> File "Quit"
  275.     mxMenuUnBind File "Open new window"
  276.     mxMenuUnBind File "Open file SEL"
  277.     mxMenuUnBind File "Switch to file SEL"
  278.     mxMenuUnBind File "Switch to previous file"
  279.     mxMenuUnBind File "Switch to tag SEL"
  280.     mxMenuUnBind File "Open on tag SEL"
  281.     mxMenuUnBind File "Go to line SEL"
  282.  
  283.     # Open a new window, using the current word as the tag
  284.     bind $widget <Escape><t> {}
  285. #    bind $widget <Escape><t> {
  286. #    set _t [mark [mark caret forw 1 word] back 1 char]
  287. #    mxselection set [mark $_t back 1 word] $_t
  288. #    applyToSelection tagOpen
  289. #   }
  290.  
  291.     ### EDITING OPERATIONS
  292.  
  293.     mxMenuBind <Control-x>u Edit "Undo"
  294.     mxMenuBind <Control-u> Edit "Do Again"
  295.     mxMenuBind <Control-w> Edit "Delete SEL"
  296.     mxMenuBind <Control-y> Edit "Paste"
  297.     mxMenuUnBind Edit "Move SEL"
  298.  
  299.     # Delete selection and save it
  300.     bind $widget <Escape><d> {}
  301.     # Paste saved selection
  302.     bind $widget <Escape><v> {}
  303.  
  304.     ### INDENTATION
  305.  
  306.     # Indent the line at the insertion point
  307.     global indent
  308.     set indent 2
  309.     mxMenuUnBind Edit "Indent line"
  310.     mxMenuUnBind Edit "Outdent line"
  311.     mxMenuUnBind Edit "Indent SEL"
  312.     mxMenuUnBind Edit "Outdent SEL"
  313.  
  314.     ### SEARCH/REPLACE OPERATIONS
  315.  
  316.     mxMenuBind <Control-s> Search "Forward"
  317.     mxMenuBind <Mod1-s>    Search "Forward for SEL"
  318.     mxMenuUnBind      Search "Backward"
  319.     mxMenuUnBind         Search "Backward for SEL"
  320.     mxMenuBind <Control-r> Search "Replace"
  321.     mxMenuBind <Mod1-r>    Search "Replace in SEL"
  322.  
  323.     # Clear and focus on the replace window
  324.     bind $widget <Escape><r>    { replaceClear }
  325.     # Make sure the find window is visible
  326.     bind $widget <Escape><s>    { findClear }
  327.  
  328.     ### KEYBOARD EDITTING
  329.  
  330.     # Delete forward character
  331.     bind $widget <Control-d> { deleteForwChar }
  332.  
  333.     # Delete backward character
  334.     bind $widget <Delete> { deleteBackChar }
  335.  
  336.     # Delete backward word
  337.     bind $widget <Escape><Delete> { deleteBackWord }
  338.  
  339.     # Delete forward word
  340.     bind $widget <Escape><d> { deleteForwWord }
  341.  
  342.     # Delete to end of line
  343.     bind $widget <Control-k> { deleteEndOfLine }
  344.  
  345.     # Open a line below this one
  346. #    bind $widget <Control-j> { openLineBelow }
  347.  
  348.     # Open a line above this one
  349. #    bind $widget <Control-k> { openLineAbove }
  350.  
  351.     ### KEYBOARD MOTION
  352.  
  353.     # Backward one character
  354.     bind $widget <Control-b> { back1char }
  355.  
  356.     # Forward one character
  357.     bind $widget <Control-f> { forw1char }
  358.  
  359.     # Down one line
  360.     bind $widget <Control-n> { down1line }
  361.  
  362.     # Up one line
  363.     bind $widget <Control-p> { up1line }
  364.  
  365.     # Backward one word
  366.     bind $widget <Escape><b> { back1word }
  367.  
  368.     # Forward one word
  369.     bind $widget <Escape><f> { forw1word }
  370.  
  371.     # To end-of-line
  372.     bind $widget <Control-e> { endOfLine }
  373.  
  374.     # To beginning of line
  375.     bind $widget <Control-a> { beginOfLine }
  376.  
  377.     # Page up
  378.     bind $widget <Escape><v> { pageUp }
  379.     bind $widget <Mod1-v> { pageUp }
  380.  
  381.     # Page down
  382.     bind $widget <Control-v> { pageDown }
  383.  
  384.     # Miscellany
  385.  
  386.     # Change focus to the command entry widget
  387.     bind $widget <Escape><x> { mxCommandFocus }
  388.  
  389. #    bind $widget <Control-question> { caretInfo }
  390.  
  391. }
  392.  
  393. # emacsCommandBindings --
  394.  
  395. proc emacsCommandBindings { entry } {
  396.     bind $entry <Return>        { mxDoCmd }
  397.     bind $entry <Control-Return>    { mxeditFocus }
  398.     bind $entry <Control-q>        { mxCommandHide ; mxeditFocus }
  399. }
  400.  
  401. # emacsSearchBindings --
  402. #    Extra bindings for the search entry widget
  403.  
  404. proc emacsSearchBindings { entry } {
  405.     bind $entry <Return>    { findInner forward }
  406.     bind $entry <Control-f>    { findInner forward }
  407.     bind $entry <Control-f>    { findInner forward }
  408.     bind $entry <Control-Return> { findInner backward }
  409.     bind $entry <Control-r>    { replaceFocus }
  410.     bind $entry <Control-q>    { hideFind ; mxeditFocus }
  411.     bind $entry <Control-c>    { mxeditFocus }
  412. }
  413.  
  414. # emacsReplaceBindings --
  415. #    Extra bindings for the replace entry widget
  416.  
  417. proc emacsReplaceBindings { entry } {
  418.     bind $entry <Return>    { findInner replace }
  419.     bind $entry <Control-r>    { findInner replace }
  420.     bind $entry <Mod1-r>    { findInner replaceSel }
  421.     bind $entry <Escape><r>    { findInner replaceEverywhere }
  422.     bind $entry <Control-f>    { searchFocus }
  423.     bind $entry <Control-q>    { hideFind ; mxeditFocus }
  424.     bind $entry <Control-c>    { mxeditFocus }
  425. }
  426.  
  427.  
  428. # bindLatin1 --
  429. # Bind the Latin 1 characters to insert themselves.
  430. # This is not simply
  431. # bind $widget <Key> "$widget insert %A"
  432. # because that sucks in too many strays,
  433. # plus I'm not sure that unbinding would work.
  434.  
  435. # The ! in the command string is important.  It affects the way
  436. # history operations are logged, effectively batching lots of keystroke
  437. # inserts into a single history entry.
  438.  
  439. proc bindLatin1 { widget } {
  440.     bind $widget <space> "$widget ! insert %A"
  441.     bind $widget <exclam> "$widget ! insert %A"
  442.     bind $widget <quotedbl> "$widget ! insert %A"
  443.     bind $widget <numbersign> "$widget ! insert %A"
  444.     bind $widget <dollar> "$widget ! insert %A"
  445.     bind $widget <percent> "$widget ! insert %A"
  446.     bind $widget <ampersand> "$widget ! insert %A"
  447. #    bind $widget <apostrophe> "$widget ! insert %A"
  448.     bind $widget <quoteright> "$widget ! insert %A"
  449.     bind $widget <parenleft> "$widget ! insert %A"
  450.     bind $widget <parenright> "$widget ! insert %A"
  451.     bind $widget <asterisk> "$widget ! insert %A"
  452.     bind $widget <plus> "$widget ! insert %A"
  453.     bind $widget <comma> "$widget ! insert %A"
  454.     bind $widget <minus> "$widget ! insert %A"
  455.     bind $widget <period> "$widget ! insert %A"
  456.     bind $widget <slash> "$widget ! insert %A"
  457.     # 0 though 9
  458.     for {set i 48} {$i < 58} {set i [expr $i+1]} {
  459.     eval [format "bind $widget %c \"$widget ! insert %%A\"" $i]
  460.     }
  461.     bind $widget <colon> "$widget ! insert %A"
  462.     bind $widget <semicolon> "$widget ! insert %A"
  463.     bind $widget <less> "$widget ! insert %A"
  464.     bind $widget <equal> "$widget ! insert %A"
  465.     bind $widget <greater> "$widget ! insert %A"
  466.     bind $widget <question> "$widget ! insert %A"
  467.     bind $widget <at> "$widget ! insert %A"
  468.     # A through Z
  469.     for {set i 65} {$i < 91} {set i [expr $i+1]} {
  470.     eval [format "bind $widget %c \"$widget ! insert %%A\"" $i]
  471.     }
  472.     bind $widget <bracketleft> "$widget ! insert %A"
  473.     bind $widget <backslash> "$widget ! insert %A"
  474.     bind $widget <bracketright> "$widget ! insert %A"
  475.     bind $widget <asciicircum> "$widget ! insert %A"
  476.     bind $widget <underscore> "$widget ! insert %A"
  477. #    bind $widget <grave> "$widget ! insert %A"
  478.     bind $widget <quoteleft> "$widget ! insert %A"
  479.     # a through z
  480.     for {set i 97} {$i < 123} {set i [expr $i+1]} {
  481.     eval [format "bind $widget %c \"$widget ! insert %%A\"" $i]
  482.     }
  483.     bind $widget <braceleft> "$widget ! insert %A"
  484.     bind $widget <bar> "$widget ! insert %A"
  485.     bind $widget <braceright> "$widget ! insert %A"
  486.     bind $widget <asciitilde> "$widget ! insert %A"
  487. }
  488.  
  489. # bindMarks --
  490. #    Set up bindings to make and move to marks.
  491. #    STILL BROKEN.  <Escape><m><a> does set a mark,
  492. #    but it also inserts "m".
  493.  
  494. proc bindMarks { widget } {
  495.     bind $widget <Escape><m><a> {set _marka [mark caret]}
  496.     bind $widget <Mod1-m><a> {see $_marka; caret $_marka}
  497.     bind $widget <Escape><m><b> {set _markb [mark caret]}
  498.     bind $widget <Mod1-m><b> {see $_markb; caret $_markb}
  499.     bind $widget <Escape><m><c> {set _markc [mark caret]}
  500.     bind $widget <Mod1-m><c> {see $_markc; caret $_markc}
  501.     bind $widget <Escape><m><d> {set _markd [mark caret]}
  502.     bind $widget <Mod1-m><d> {see $_markd; caret $_markd}
  503.     bind $widget <Escape><m><e> {set _marke [mark caret]}
  504.     bind $widget <Mod1-m><e> {see $_marke; caret $_marke}
  505.     bind $widget <Escape><m><f> {set _markf [mark caret]}
  506.     bind $widget <Mod1-m><f> {see $_markf; caret $_markf}
  507.     bind $widget <Escape><m><g> {set _markg [mark caret]}
  508.     bind $widget <Mod1-m><g> {see $_markg; caret $_markg}
  509.     bind $widget <Escape><m><h> {set _markh [mark caret]}
  510.     bind $widget <Mod1-m><h> {see $_markh; caret $_markh}
  511.     bind $widget <Escape><m><i> {set _marki [mark caret]}
  512.     bind $widget <Mod1-m><i> {see $_marki; caret $_marki}
  513.     bind $widget <Escape><m><j> {set _markj [mark caret]}
  514.     bind $widget <Mod1-m><j> {see $_markj; caret $_markj}
  515.     bind $widget <Escape><m><k> {set _markk [mark caret]}
  516.     bind $widget <Mod1-m><k> {see $_markk; caret $_markk}
  517.     bind $widget <Escape><m><l> {set _markl [mark caret]}
  518.     bind $widget <Mod1-m><l> {see $_markl; caret $_markl}
  519.     bind $widget <Escape><m><m> {set _markm [mark caret]}
  520.     bind $widget <Mod1-m><m> {see $_markm; caret $_markm}
  521.     bind $widget <Escape><m><n> {set _markn [mark caret]}
  522.     bind $widget <Mod1-m><n> {see $_markn; caret $_markn}
  523.     bind $widget <Escape><m><o> {set _marko [mark caret]}
  524.     bind $widget <Mod1-m><o> {see $_marko; caret $_marko}
  525.     bind $widget <Escape><m><p> {set _markp [mark caret]}
  526.     bind $widget <Mod1-m><p> {see $_markp; caret $_markp}
  527.     bind $widget <Escape><m><q> {set _markq [mark caret]}
  528.     bind $widget <Mod1-m><q> {see $_markq; caret $_markq}
  529.     bind $widget <Escape><m><r> {set _markr [mark caret]}
  530.     bind $widget <Mod1-m><r> {see $_markr; caret $_markr}
  531.     bind $widget <Escape><m><s> {set _marks [mark caret]}
  532.     bind $widget <Mod1-m><s> {see $_marks; caret $_marks}
  533.     bind $widget <Escape><m><t> {set _markt [mark caret]}
  534.     bind $widget <Mod1-m><t> {see $_markt; caret $_markt}
  535.     bind $widget <Escape><m><u> {set _marku [mark caret]}
  536.     bind $widget <Mod1-m><u> {see $_marku; caret $_marku}
  537.     bind $widget <Escape><m><v> {set _markv [mark caret]}
  538.     bind $widget <Mod1-m><v> {see $_markv; caret $_markv}
  539.     bind $widget <Escape><m><w> {set _markw [mark caret]}
  540.     bind $widget <Mod1-m><w> {see $_markw; caret $_markw}
  541.     bind $widget <Escape><m><x> {set _markx [mark caret]}
  542.     bind $widget <Mod1-m><x> {see $_markx; caret $_markx}
  543.     bind $widget <Escape><m><y> {set _marky [mark caret]}
  544.     bind $widget <Mod1-m><y> {see $_marky; caret $_marky}
  545.     bind $widget <Escape><m><z> {set _markz [mark caret]}
  546.     bind $widget <Mod1-m><z> {see $_markz; caret $_markz}
  547. }
  548.  
  549.  
  550.